package org.chnxi.study.concurrent.semaphore.demo1;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 信号量通常用于限制线程的数量访问一些(物理或逻辑)资源.
 * 使用场景：竞争仅有的资源、一个车厢最多可容纳多少人数，超载则不能上车，或者每条通道一次仅能n个人进入，剩下的需要排队等等。。
 */
public class SemaphoreTest {

    public static void main(String[] args) {

        // 设置资源并发访问数量为3
        Semaphore semaphore = new Semaphore(3 ,true );

        for(int i=0; i<10; i++){
            new Thread(()->{
                try{
                    System.out.println(Thread.currentThread().getName()+"-开始执行");
                    semaphore.acquire(); //尝试拿到可执行的资源，如果拿不到，阻塞等待
                    System.out.println(Thread.currentThread().getName()+"-拿到资源，可以执行");
                    TimeUnit.MILLISECONDS.sleep(50); // 模拟业务耗时
                    System.out.println(Thread.currentThread().getName()+"-使用完毕，待释放资源");
                }catch (Exception e){
                    e.printStackTrace();
                } finally {
                    semaphore.release(); //释放资源
                }
            } , "T-"+i).start();
        }
    }
}
